TCL-事务管理

事务创建

创建事务

基本语法:

1
2
3
4
5
6
set autocommit = 0; #开始 事务
start transaction; #可省略
SQL_Statements1;
SQL_Statements2;
...
commit; #结束 可使用回滚语句:rollback;

注意:在事务执行过程中的语句均改变表中数据,当使用commit结束时,结束事务并永久改变数据。使用roll back时,结束事务,放弃事务中对数据的改变,数据恢复事务开始前。

保存点

save point 可配合roll back 使用,结束事务并滚回到保存点位置

基本语法:

1
2
3
4
5
6
set autocommit = 0;
start transaction;
SQL_Statements1;
savepoint SP_name;
SQL_Statements2;
rollback to SP_name; #回滚到保存点SP_name

事务并发

读取问题

当多个事务并发时,未设置隔离级别时可能出现以下问题:

  1. 脏读:读取了被 roll back 的数据
  2. 不可重复读:多次读取的结果不相同
  3. 幻读:
隔离级别

MySQL 支持4种隔离级别,默认为 repeatable read

Oracle 支持2种(下表2、4),默认为read committed

read uncommitted 允许读取未被提交的变更,所有错误均可能出现
read committed 允许读取已被提交的变更,可避免脏读
repeatable read 可保证多次读取字段的值相同,避免脏读、不可重复读
serializable 串行化,事务操作表时,禁止其他事务对该表操作,性能低

隔离级别设置命令:

1
2
3
4
#仅对当前连接有效
set transaction isolation level ...
#全局隔离级别
set global transaction isolation level ...